package cn.zebra.dev.common.utils;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author runnable@sina.cn
 */
public final class DateUtils {

    /**
     * 日期格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 日期时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    /**
     * 默认时间 1900-01-01T00:00:00 (单例懒汉初始化)
     */
    private static LocalDateTime defaultTime = null;

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式，如：DateUtils.DATE_TIME_PATTERN
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }

    /**
     * 获取时间戳(毫秒)
     */
    public static Long convertLocalDateTimeToMilliSecondTimeStamp(LocalDateTime time) {
        return time.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    public static LocalDateTime defaultTime() {
        if (defaultTime == null) {
            synchronized (DateUtils.class) {
                if (defaultTime == null) {
                    LocalDate date = LocalDate.of(1900, 1, 1);
                    LocalTime time = LocalTime.of(0, 0, 0);
                    DateUtils.defaultTime = LocalDateTime.of(date, time);
                }
            }

        }
        return defaultTime;
    }

    /**
     * 获取时间戳(秒)
     */
    public static Long convertLocalDateTimeToTimeStamp(LocalDateTime time) {
        return time.toEpochSecond(ZoneOffset.of("+8"));
    }

    /**
     * 得到当前时间与某个时间的差的分钟数
     *
     * @return
     */
    public static BigDecimal diffMinute(LocalDateTime time) {
        return NumberUtils.div(new BigDecimal(System.currentTimeMillis() - time.toEpochSecond(ZoneOffset.of("+8"))), new BigDecimal("60000"));
    }

    /**
     * 时间戳转LocalDateTime 对象
     *
     * @param timeStamp 时间戳
     */
    public static LocalDateTime convertTimeStampToLocalDateTime(Long timeStamp) {
        return LocalDateTime.ofEpochSecond(timeStamp / 1000, 0, ZoneOffset.ofHours(8));
    }

    /**
     * 时间戳转LocalDate对象
     *
     * @param timeStamp 时间戳
     */
    public static LocalDate convertTimeStampToLocalDate(Long timeStamp) {
        LocalDateTime time = convertTimeStampToLocalDateTime(timeStamp);
        return time.toLocalDate();
    }

    /**
     * 获取时间戳(秒)
     */
    public static Long currentTimeStamp() {
        String temp = String.valueOf(System.currentTimeMillis());
        return Long.valueOf(temp.substring(0, temp.length() - 3));
    }
}
